home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Atari Mega Archive 1
/
Atari Mega Archive - Volume 1.iso
/
archiver
/
lzhsourc.lzh
/
LZH.SRC
/
LHA5.S
< prev
next >
Wrap
Text File
|
1992-07-02
|
36KB
|
809 lines
import flg_n ; <> 0, wenn kein Output
import output_pos
import output_mask
import bufsiz
import send_block
import buf
import c_freq
import p_freq
import avail
import next
export childcount
import prev
import parent
import level
import position
import pos
export text
import remainder
import infile
import _StdErrF
import _StdOutF
import unpackable
import origsize
import compsize
import memmove
import memcpy
import fread_crc
import fputc
import putc
import make_crctable
import allocate_memory
import start_huf
import end_huf
import allocate_memory
import init_slide
import start_huf
export split
export insert_node
export delete_node
export get_next_match
export encode5
export init_encode5
export output5
init_slide:
move.l A2,-(SP)
move.w #$2000,D0
lea level,A0
lea position,A1
bra.b islide2
islide1: movea.l (A0),A2
move.b #1,0(A2,D0.w)
move.w D0,D1
ext.l D1
add.l D1,D1
movea.l (A1),A2
clr.w 0(A2,D1.l)
addq.w #1,D0
islide2:
cmp.w #$20FF,D0
ble.b islide1
move.w #$2000,D0
lea parent,A1
bra.b islide4
islide3:
move.w D0,D1
ext.l D1
add.l D1,D1
movea.l (A1),A0
clr.w 0(A0,D1.l)
addq.w #1,D0
islide4:
cmp.w #$4000,D0
blt.b islide3
move.w #1,avail
moveq #1,D0
lea next,A1
bra.b islide6
islide5:
moveq #1,D1
add.w D0,D1
move.w D0,D2
ext.l D2
add.l D2,D2
movea.l (A1),A0
move.w D1,0(A0,D2.l)
addq.w #1,D0
islide6:
cmp.w #$1FFF,D0
blt.b islide5
movea.l (A1),A0
clr.w $3FFE(A0)
move.w #$4000,D0
bra.b islide8
islide7:
move.w D0,D1
ext.l D1
add.l D1,D1
movea.l (A1),A0
clr.w 0(A0,D1.l)
addq.w #1,D0
islide8:
cmp.w #$70EF,D0
ble.b islide7
movea.l (SP)+,A2
rts
; --------------------------------------; beg child
slide: moveq #0,D2 ;
move.b D1,D2 ;
lsl.w #4,D2 ;
add.w D0,D2 ;
add.w #$4000,D2 ; h=HASH(q,c)
ext.l d2 ; h
add.l D2,D2 ; 2*h
move.w D0,(A2) ; parent[NIL]=q
child1: move.w 0(A4,D2.l),D1 ; r=next[r]
move.w D1,D2 ; r
ext.l D2 ; r
add.l D2,D2 ; 2*r
cmp.w 0(A2,D2.l),D0 ; while (parent[r] != NIL)
bne.b child1 ;
move.w D1,D0 ; return r
rts ; end child
; --------------------------------------;
makechild: movem.l D3/d4,-(SP)
moveq #0,D4
move.b D1,D4
lsl.w #4,D4 ; c<<DICBIT-9
add.w D0,D4 ; p+c
add.w #$4000,D4 ; ((p)+((c)<<(DICBIT-9))+(DICSIZ*2)
move.w D4,D1 ; h
ext.l D4 ; h
add.l D4,D4 ; 2*h
move.w 0(A4,D4.l),D3 ; t=next[h]
move.w D2,0(A4,D4.l) ; next[h]=r
move.w D2,D4 ; r
ext.l D4 ; r
add.l D4,D4 ; 2*r
move.w D3,0(A4,D4.l) ; next[r]=t
ext.l D3 ; t
add.l D3,D3 ; 2*t
move.w D2,0(A3,D3.l) ; prev[t]=r
move.w D1,0(A3,D4.l) ; prev[r]=h
move.w D0,0(A2,D4.l) ; parent[r]=q
movea.l childcount-pos(a6),A0 ;
addq.b #1,0(A0,D0.w) ; childcount[q]++
movem.l (SP)+,d3/d4
rts
;».MODULE LOCAL
; --------------------------------------;
insert_node: ;
cmp.w #4,d7 ; if (matchl >= 4)
blt inode7 ;
subq.w #1,d7 ; matchl--
moveq #1,D4 ;
add.w d6,D4 ;
or.w #$2000,D4 ; r=(matchpos+1)|DICSIZ
; --------------------------------------;
; --------------------------------------;
bra.b inode2 ; while ((q=parent[r]==NIL) {
inode1: move.w 0(A4,D0.l),D4 ; r=next[r]
inode2: move.w D4,D0 ; r
ext.l D0 ; r
add.l D0,D0 ; r * 2
move.w 0(A2,D0.l),D5 ; q=parent[r]
beq.b inode1 ; }
; --------------------------------------;
; --------------------------------------;
movea.l level,A0 ;
bra.b inode4 ; while (level[q] >= matchl) {
inode3: move.w D5,D4 ; r = q
; ext.l D5 ; q
add.l D5,D5 ; q * 2
move.w 0(A2,D5.w),D5 ; q=parent[q]
inode4: moveq #0,D0 ;
move.b 0(A0,D5.w),D0 ; level[q]
cmp.w D0,d7 ; }
ble.b inode3 ;
; --------------------------------------;
; --------------------------------------;
move.w D5,D0 ; t = q
movea.l position-pos(a6),A0 ; while (position[t] < 0) {
bra.b inode6 ;
inode5: move.w (A6),0(A0,D0.l) ; position[t] = pos
move.w 0(A2,D0.l),D0 ; t=parent[t]
inode6: ; ext.l D0 ; t
add.l D0,D0 ; t * 2
move.w 0(A0,D0.l),D1 ; position[t]
blt.b inode5 ; }
; end while ----------------------- ;
cmp.w #$4000,D0 ; if (t < DICSIZ) {
bge inode9 ;
move.w (A6),D2 ; pos
or.w #$8000,D2 ; pos | PERC_FLAG
move.w D2,0(A0,D0.l) ; position[t] = pos | PERC_FLAG
bra inode9 ;
; --------------------------------------:
inode7: move.w (A6),D0 ; pos
movea.l text-pos(a6),A0 ;
moveq #0,d5 ;
move.b 0(A0,D0.w),D5 ; q = text[pos]
add.w #$2000,D5 ; + DICSIZE
move.b 1(A0,D0.w),d7 ; c = text[pos+1]
move.b d7,D1 ; c
; --------------------------------------; be